﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ВладелецФайла = Параметры.ВладелецФайла;
	
	ТекущаяСсылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ТекущаяСтрока");
	СписокОткрытИзКарточкиФайла = ЗначениеЗаполнено(ТекущаяСсылка);
	Элементы.ВладелецФайла.Видимость = СписокОткрытИзКарточкиФайла И Не Параметры.СкрыватьВладельца;
	Если СписокОткрытИзКарточкиФайла И ВладелецФайла = Неопределено Тогда
		ВладелецФайла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущаяСсылка, "ВладелецФайла");
		Параметры.ВладелецФайла = ВладелецФайла;
	КонецЕсли;
	Если Параметры.ВладелецФайла = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Список присоединенных файлов можно посмотреть
		                             |только в форме объекта-владельца.'");
	КонецЕсли;
	
	ТипВладельца = ТипЗнч(Параметры.ВладелецФайла);
	Если Метаданные.ОпределяемыеТипы.ВладелецФайлов.Тип.СодержитТип(ТипВладельца) Тогда
		ПолноеИмяВладельца = Метаданные.НайтиПоТипу(ТипВладельца).Имя;
		Если Метаданные.Справочники.Найти(ПолноеИмяВладельца + РаботаСФайламиКлиентСервер.СуффиксСправочникаПрисоединенныеФайлы()) = Неопределено Тогда
			ЭтоВладелецЭлементовСправочникаФайлы = Истина;
		КонецЕсли;
	КонецЕсли;
	
	ПоложениеВКоманднойПанели = ?(Параметры.ПростаяФорма, ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю, 
		ПоложениеКнопкиВКоманднойПанели.Авто);
	Элементы.ФормаРедактировать.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели;
	Элементы.ФормаОткрыть.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели;
	Элементы.ФормаЗакончитьРедактирование.ПоложениеВКоманднойПанели = ПоложениеВКоманднойПанели;
	Элементы.СписокВажныеРеквизиты.Видимость = Не Параметры.ПростаяФорма;
	Предпросмотр = Параметры.ПростаяФорма;
	
	ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебный.ПолучитьПоказыватьКолонкуРазмер();
	Если Не ПоказыватьКолонкуРазмер Тогда
		Элементы.СписокРазмер.Видимость = Ложь;
	КонецЕсли;
	
	Если Не ПустаяСтрока(Параметры.ЗаголовокФормы) Тогда
		Заголовок = Параметры.ЗаголовокФормы;
	ИначеЕсли СписокОткрытИзКарточкиФайла Тогда
		Заголовок = Заголовок + ": " + ОбщегоНазначения.ПредметСтрокой(ВладелецФайла);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Параметры.ПараметрыОтправки) Тогда
		ПараметрыОтправки = Параметры.ПараметрыОтправки;
	Иначе
		ПараметрыОтправки = РаботаСФайламиСлужебный.ПодготовитьСтруктуруПараметровОтправки();
	КонецЕсли;
	
	Если Параметры.РежимВыбора Тогда
		СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "ВыборПодбор");
		РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
		Заголовок = НСтр("ru = 'Выбор присоединенного файла'");
	Иначе
		Элементы.Список.РежимВыбора = Ложь;
	КонецЕсли;
	
	НастройкиФайлов = РаботаСФайламиСлужебный.НастройкиФайлов();
	
	ИмяСправочникаХранилищаФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияФайлов(Параметры.ВладелецФайла);
	ТипСправочникаСФайлами = Тип("СправочникСсылка." + ИмяСправочникаХранилищаФайлов);
	МетаданныеСправочникаСФайлами = Метаданные.НайтиПоТипу(ТипСправочникаСФайлами);
	ИмяСправочникаХранилищаВерсийФайлов = РаботаСФайламиСлужебный.ИмяСправочникаХраненияВерсийФайлов(Параметры.ВладелецФайла);
	ЕстьГруппыФайлов = МетаданныеСправочникаСФайлами.Иерархический;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда 
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		ЕстьПравоИспользоватьШаблоны = МодульУправлениеДоступом.ЕстьПраво("Чтение", Справочники.ПапкиФайлов.Шаблоны);
	Иначе
		ЕстьПравоИспользоватьШаблоны = ПравоДоступа("Чтение", Метаданные.Справочники.Файлы) И ПравоДоступа("Чтение", Метаданные.Справочники.ПапкиФайлов)
	КонецЕсли;
	
	Если НЕ ЕстьПравоИспользоватьШаблоны Или НастройкиФайлов.НеСоздаватьФайлыПоШаблону.Найти(Метаданные.НайтиПоТипу(ТипЗнч(ВладелецФайла))) <> Неопределено Тогда
		Элементы.ДобавитьФайлПоШаблону.Видимость = Ложь;
		Элементы.СписокКонтекстноеМенюДобавитьФайлПоШаблону.Видимость = Ложь;
	КонецЕсли;
	
	ЕстьВерсииФайлов = ЭтоВладелецЭлементовСправочникаФайлы;
	Если ТипЗнч(Пользователи.АвторизованныйПользователь()) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда
		РаботаСФайламиСлужебный.ИзменитьФормуДляВнешнегоПользователя(ЭтотОбъект, Истина);
	КонецЕсли;
	
	ЕстьРеквизитСлужебный = РаботаСФайламиСлужебный.ЕстьРеквизитСлужебный(ИмяСправочникаХранилищаФайлов);
	НастроитьДинамическийСписок();
	ВывестиУведомлениеЕслиМногоГрупп(МетаданныеСправочникаСФайлами);
	
	Если Не ЕстьГруппыФайлов Тогда
		СкрытьКнопкиСозданияГруппы();
	КонецЕсли;
	
	ЕстьПравоДобавления = Истина;
	Если НЕ ПравоДоступа("ИнтерактивноеДобавление", МетаданныеСправочникаСФайлами) Тогда
		СкрытьКнопкиДобавления();
		ЕстьПравоДобавления = Ложь;
	КонецЕсли;
	
	ИменаЭлементовКнопокФормы = ОпределитьИменаЭлементовКнопокФормы(); 
	ТолькоПросмотр = Не ПравоДоступа("Редактирование", МетаданныеСправочникаСФайлами);
	Если ТолькоПросмотр Тогда
		СкрытьКнопкиИзменения();
	КонецЕсли;
	
	ПриИзмененииИспользованияПодписанияИлиШифрованияНаСервере();
	
	ИспользоватьПредпросмотр = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(ТипСправочникаСФайлами, "Предпросмотр");
	Если ИспользоватьПредпросмотр <> Неопределено Тогда
		Предпросмотр = ИспользоватьПредпросмотр;
	КонецЕсли;
	
	Элементы.АдресДанныхФайла.Видимость = Предпросмотр;
	Элементы.Предпросмотр.Пометка       = Предпросмотр;
	
	РасширенияПоддерживающиеПредпросмотр = РаботаСФайламиСлужебный.СписокРасширенийДляПредпросмотра();
	
	ОбновитьПояснениеОблачногоСервиса();
	
	Элементы.НастроитьСинхронизацию.Видимость = ПравоДоступа("Редактирование", Метаданные.Справочники.УчетныеЗаписиСинхронизацииФайлов);
	ЕстьЭлектроннаяПодпись = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись");
	Элементы.ПечатьСоШтампом.Видимость = ЕстьЭлектроннаяПодпись;
	Элементы.СравнитьФайлы.Видимость = Не ОбщегоНазначения.ЭтоLinuxКлиент() И Не ОбщегоНазначения.ЭтоВебКлиент();
	
	ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений();
	Элементы.ПоказыватьСлужебныеФайлы.Видимость = ЕстьРеквизитСлужебный
		И Пользователи.ЭтоПолноправныйПользователь();
	
	УстановитьУсловноеОформление();
	Если ЕстьРеквизитСлужебный Тогда
		РаботаСФайламиСлужебный.ДобавитьОтборыВСписокФайлов(Список);
	Иначе
		РаботаСФайламиСлужебный.УстановитьОтборПоПометкеУдаления(Список.Отбор);
	КонецЕсли;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		ПараметрыРазмещения = МодульПодключаемыеКоманды.ПараметрыРазмещения();
		Типы = Новый Массив;
		Типы.Добавить(ТипСправочникаСФайлами);
		ПараметрыРазмещения.Источники = Новый ОписаниеТипов(Типы);
		МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыРазмещения);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ПодменюДобавить.Отображение = ОтображениеКнопки.Картинка;
		Элементы.ДобавитьФайлСоСканера.Заголовок = НСтр("ru = 'С камеры устройства...'");
	КонецЕсли;
	
	РаботаСФайламиПереопределяемый.ПриСозданииФормыСпискаФайлов(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ЕстьПравоДобавления Тогда
		ДоступнаКомандаСканировать = РаботаСФайламиСлужебныйКлиент.ДоступноСканирование();
		Элементы.ДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать;
		Элементы.СписокКонтекстноеМенюДобавитьФайлСоСканера.Видимость = ДоступнаКомандаСканировать;
	КонецЕсли;
	
	УстановитьДоступностьФайловыхКоманд();
	
	Если Элементы.ИнформационноеСообщение.Видимость 
	   И Элементы.Список.Отображение = ОтображениеТаблицы.Список Тогда
		 Элементы.ИнформационноеСообщение.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант")
		И (ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи")
		Или ВРег(Источник) = ВРег("ИспользоватьШифрование")) Тогда
		
		ПодключитьОбработчикОжидания("ПриИзмененииИспользованияПодписанияИлиШифрования", 0.3, Истина);
		Возврат;
	ИначеЕсли ИмяСобытия = "Запись_Файл" Тогда
		
		Элементы.Список.Обновить();
		Если Не ЗначениеЗаполнено(Источник)
			Или (ТипЗнч(Источник) = Тип("Массив")
			И Источник.Количество() = 0) Тогда
			Возврат;
		КонецЕсли;
		
		СсылкаНаФайл = ?(ТипЗнч(Источник) = Тип("Массив"), Источник[0], Источник);
		Если ТипЗнч(СсылкаНаФайл) <> ТипСправочникаСФайлами Тогда
			Возврат;
		КонецЕсли;
		
		Если Параметр.ЭтоНовый = Истина Тогда
			
			Элементы.Список.ТекущаяСтрока = СсылкаНаФайл;
			УстановитьДоступностьФайловыхКоманд();
			
		Иначе
			ТекущиеДанные = ТекущиеДанные();
			Если ФайловыеКомандыДоступны() И ТекущиеДанные <> Неопределено 
				 И СсылкаНаФайл = ТекущиеДанные.Ссылка Тогда
				УстановитьДоступностьФайловыхКоманд();
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли ИмяСобытия = "Запись_ПапкиФайлов" Тогда
		Элементы.Список.Обновить();
		УстановитьДоступностьФайловыхКоманд();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ДекорацияДатаСинхронизацииОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "OpenJournal" Тогда
		
		СтандартнаяОбработка = Ложь;
		ПараметрыОтбора = ДанныеОтбораЖурналаРегистрации(УчетнаяЗапись);
		ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(ПараметрыОтбора, ЭтотОбъект);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Элементы.Список.РежимВыбора Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если Элементы.Список.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекущиеДанные.ЭтоГруппа Тогда
		ПоказатьЗначение(, ВыбраннаяСтрока);
		Возврат;
	КонецЕсли;
	
	КакОткрывать = РаботаСФайламиСлужебныйКлиент.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши;
	
	Если КакОткрывать = "ОткрыватьКарточку" Тогда
		ПоказатьЗначение(, ВыбраннаяСтрока);
		Возврат;
	КонецЕсли;
	
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ВыбраннаяСтрока,
		Неопределено, УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла);
	
	ПараметрыОбработчика = Новый Структура;
	ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла);
	Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаРедактирования", ЭтотОбъект, ПараметрыОбработчика);
	
	РаботаСФайламиСлужебныйКлиент.ВыбратьРежимИРедактироватьФайл(Обработчик, ДанныеФайла, Элементы.ФормаРедактировать.Доступность);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	ОбновитьДоступностьФайловыхКоманд();
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

КонецПроцедуры

&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Отказ = Истина;
	
	Если Копирование Тогда
		
		Если НЕ ФайловыеКомандыДоступны() Тогда
			Возврат;
		КонецЕсли;
		
		ТекущиеДанные = ТекущиеДанные();
		
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы = Новый Структура("ЗначениеКопирования", ТекущиеДанные);
		
		Если ТекущиеДанные.ЭтоГруппа Тогда
			ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы);
		Иначе
			РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ТекущиеДанные.Ссылка, ПараметрыФормы);
		КонецЕсли;
		
	Иначе
		
		ДобавитьФайл();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	ОткрытьКарточкуФайла();
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	Если ФайлыРедактируютсяВОблачномСервисе Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
		ПараметрыПеретаскивания.Значение = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	ВладелецСправочникФайлы = Ложь;
	
	МассивИменФайлов = Новый Массив;
	Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив")
		И ПараметрыПеретаскивания.Значение.Количество() > 0 Тогда
		
		ПеретаскиваемыйФайл = ПараметрыПеретаскивания.Значение[0];
		Если ТипЗнч(ПеретаскиваемыйФайл) <> Тип("Файл") Тогда
			
			ВладелецФайловСовпадает = ВладелецФайловСовпадает(Параметры.ВладелецФайла, ПеретаскиваемыйФайл);
			Если ЕстьГруппыФайлов И ТипЗнч(ПеретаскиваемыйФайл) = ТипСправочникаСФайлами
				И ВладелецФайловСовпадает Тогда
				Возврат;
			КонецЕсли;
			
		КонецЕсли;
		
		СтандартнаяОбработка = Ложь;
		Для Каждого ПеретаскиваемыйФайл Из ПараметрыПеретаскивания.Значение Цикл
			
			Если ТипЗнч(ПеретаскиваемыйФайл) = Тип("Файл")
				И ПеретаскиваемыйФайл.ЭтоФайл() Тогда
				
				МассивИменФайлов.Добавить(ПеретаскиваемыйФайл.ПолноеИмя);
				ВладелецСправочникФайлы = Истина;
			Иначе
				МассивИменФайлов.Добавить(ПеретаскиваемыйФайл);
			КонецЕсли;
			
		КонецЦикла;
		
	ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл")
		И ПараметрыПеретаскивания.Значение.ЭтоФайл() Тогда
		
		СтандартнаяОбработка = Ложь;
		МассивИменФайлов.Добавить(ПараметрыПеретаскивания.Значение.ПолноеИмя);
		ВладелецСправочникФайлы = Истина;
		
	КонецЕсли;
	
	Если МассивИменФайлов.Количество() > 0 Тогда
		Если ВладелецСправочникФайлы = Истина Тогда
			РаботаСФайламиСлужебныйКлиент.ДобавитьФайлыПеретаскиванием(
				Параметры.ВладелецФайла, УникальныйИдентификатор, МассивИменФайлов);
		Иначе
			
			Действие = ?(ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование,
				"Копирование", "Перемещение");
			ПереместитьИлиСкопироватьПрисоединенныеФайлы(МассивИменФайлов, Параметры.ВладелецФайла, Действие);
			
			ОповеститьОбИзменении(Параметры.ВладелецФайла);
			ПараметрыОповещенияЗаписиФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОповещенияЗаписиФайла();
			ПараметрыОповещенияЗаписиФайла.ЭтоНовый = Истина;
			ПараметрыОповещенияЗаписиФайла.Владелец = Параметры.ВладелецФайла;
			Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла, МассивИменФайлов);
			
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПриИзменении(Элемент)
	
	ОповеститьОбИзменении(ВладелецФайла);
	ПараметрыОповещенияЗаписиФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены");
	Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла, Элемент.ВыделенныеСтроки);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

///////////////////////////////////////////////////////////////////////////////////
// Обработчики команд файлов

&НаКлиенте
Процедура Добавить(Команда)
	
	ДобавитьФайл();
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьФайлПоШаблону(Команда)
	
	ПараметрыДобавления = Новый Структура;
	ПараметрыДобавления.Вставить("ОбработчикРезультата",          Неопределено);
	ПараметрыДобавления.Вставить("ВладелецФайла",                 ВладелецФайла);
	ПараметрыДобавления.Вставить("ФормаВладелец",                 ЭтотОбъект);
	ПараметрыДобавления.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов);
	РаботаСФайламиСлужебныйКлиент.ДобавитьНаОсновеШаблона(ПараметрыДобавления);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьФайлСоСканера(Команда)
	
	ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВладелецФайлов"));
	Если ЗначениеПараметраКД = Неопределено Тогда
		ВладелецФайла = Неопределено;
	Иначе
		ВладелецФайла = ЗначениеПараметраКД.Значение;
	КонецЕсли;
	
	ПараметрыДобавления = РаботаСФайламиКлиент.ПараметрыДобавленияСоСканера();
	ПараметрыДобавления.ВладелецФайла = ВладелецФайла;
	ПараметрыДобавления.ФормаВладелец = ЭтотОбъект;
	ПараметрыДобавления.НеОткрыватьКарточкуПослеСозданияИзФайла = Истина;
	ПараметрыДобавления.ЭтоФайл = Ложь;
	РаботаСФайламиКлиент.ДобавитьСоСканера(ПараметрыДобавления);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФайлДляПросмотра(Команда)
	
	ОткрытьФайл();
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьКаталогФайла(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные.Зашифрован Тогда
		// Файл может быть изменен в другом сеансе.
		ОповеститьОбИзменении(ТекущиеДанные.Ссылка);
		Возврат;
	КонецЕсли;
	ТекущиеДанные = ТекущиеДанные();
	ФайлСсылка = ТекущиеДанные.Ссылка;
	
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ФайлСсылка,
		Неопределено, УникальныйИдентификатор, Неопределено, Неопределено);
	РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла);

	
КонецПроцедуры

&НаКлиенте
Процедура Обновить(Команда)
	
	Элементы.Список.Обновить();
	
	ПодключитьОбработчикОжидания("ОбновитьДоступностьФайловыхКоманд", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаНаДиске(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	Если ТекущиеДанные.Зашифрован Или ТекущиеДанные.ПодписанЭП Или ТекущиеДанные.ФайлРедактируется Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока);
	РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКак(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные.Зашифрован
		ИЛИ (ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь) Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(ТекущиеДанные.Ссылка, , УникальныйИдентификатор);
	РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено);
	
КонецПроцедуры

&НаКлиенте
Процедура Скопировать(Команда)
	
	Элементы.Список.СкопироватьСтроку();
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкуУдаления(Команда)
	
	ВыделенныеСтроки = ВыделенныеСтроки();

	Если ВыделенныеСтроки.Количество() = 0 Или Не СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(Элементы.Список) Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	Если ВыделенныеСтроки.Количество() = 1 Тогда
		ШаблонВопроса = ?(ТекущиеДанные.ПометкаУдаления,
			НСтр("ru = 'Снять с ""%1"" пометку на удаление?'"),
			НСтр("ru = 'Пометить ""%1"" на удаление?'"));
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонВопроса, ТекущиеДанные.Наименование);
	Иначе
		ТекстВопроса = ?(ТекущиеДанные.ПометкаУдаления,
			НСтр("ru = 'Снять с выбранных файлов пометку на удаление?'"),
			НСтр("ru = 'Пометить выбранные файлы на удаление?'"));
	КонецЕсли;
	ДополнительныеПараметры = Новый Структура("Файлы", ВыделенныеСтроки);
	Оповещение = Новый ОписаниеОповещения("УстановитьПометкуУдаленияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСвойстваФайла(Команда)
	
	ОткрытьКарточкуФайла();
	
КонецПроцедуры

&НаКлиенте
Процедура Отправить(Команда)
	
	ПриОтправкеФайловПочтой(ПараметрыОтправки, Элементы.Список.ВыделенныеСтроки, ВладелецФайла, УникальныйИдентификатор);
	
	РаботаСФайламиСлужебныйКлиент.ОтправитьФайлыПоПочте(
		Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор, ПараметрыОтправки);
	
КонецПроцедуры

&НаКлиенте
Процедура Печать(Команда)
	
	ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() > 0 Тогда
		РаботаСФайламиКлиент.НапечататьФайлы(ВыделенныеСтроки, УникальныйИдентификатор);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьСоШтампом(Команда)
	
	ТекущиеДанные = ТекущиеДанные();
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДокументСоШтампом = РаботаСФайламиСлужебныйВызовСервера.ДокументСоШтампом(ТекущиеДанные.Ссылка);
	РаботаСФайламиСлужебныйКлиент.ПечатьФайлаСоШтампом(ДокументСоШтампом, ТекущиеДанные.Наименование);
	
КонецПроцедуры

&НаКлиенте
Процедура Предпросмотр(Команда)
	
	Предпросмотр = Не Предпросмотр;
	Элементы.Предпросмотр.Пометка = Предпросмотр;
	УстановитьВидимостьПредпросмотра(Предпросмотр);
	СохранитьВариантПредпросмотра(ТипСправочникаСФайлами, Предпросмотр);
	
	#Если ВебКлиент Тогда
	ОбновитьПредпросмотр();
	#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьСинхронизацию(Команда)
	
	НастройкаСинхронизации = ПараметрыНастройкиСинхронизации(ВладелецФайла);
	
	Если ЗначениеЗаполнено(НастройкаСинхронизации.УчетнаяЗапись) Тогда
		ТипЗначения = Тип("РегистрСведенийКлючЗаписи.НастройкиСинхронизацииФайлов");
		ПараметрыЗаписи = Новый Массив(1);
		ПараметрыЗаписи[0] = НастройкаСинхронизации;
		
		КлючЗаписи = Новый(ТипЗначения, ПараметрыЗаписи);
	
		ПараметрыЗаписи = Новый Структура;
		ПараметрыЗаписи.Вставить("Ключ", КлючЗаписи);
	Иначе
		ПараметрыЗаписи = НастройкаСинхронизации;
	КонецЕсли;
	
	ОткрытьФорму("РегистрСведений.НастройкиСинхронизацииФайлов.Форма.ПростаяФормаЗаписиНастройки", ПараметрыЗаписи, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьГруппу(Команда)
	
	ПараметрыФормы = Новый Структура;
	
	ТекущиеДанные = ТекущиеДанные();
	Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ВладелецФайла <> ВладелецФайла Тогда
		ТекущиеДанные = Неопределено;
	КонецЕсли;
	
	Если ТекущиеДанные <> Неопределено Тогда
		ПараметрыФормы.Вставить("Родитель", ТекущиеДанные.Ссылка);
	Иначе
		ПараметрыФормы.Вставить("Родитель", ВладелецФайла);
	КонецЕсли;
	
	ПараметрыФормы.Вставить("ВладелецФайла",  ВладелецФайла);
	ПараметрыФормы.Вставить("ЭтоНоваяГруппа", Истина);
	ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов);
	
	ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайлы(Команда)
	#Если ВебКлиент Тогда
		ТекстПредупреждения =  НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается.
		                                  |Используйте команду ""Создать"" в списке файлов.'");
		ПоказатьПредупреждение(, ТекстПредупреждения);
		Возврат;
	#КонецЕсли
	
	МассивИменФайлов = РаботаСФайламиСлужебныйКлиент.ИмпортируемыеФайлы();
	
	Если МассивИменФайлов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВладелецФайлов"));
	Если ЗначениеПараметраКД = Неопределено Тогда
		ВладелецФайла = Неопределено;
	Иначе
		ВладелецФайла = ЗначениеПараметраКД.Значение;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПапкаДляДобавления",            ВладелецФайла);
	ПараметрыФормы.Вставить("МассивИменФайлов",              МассивИменФайлов);
	ТекущиеДанные = ТекущиеДанные();
	ГруппаФайлов = Неопределено;
	Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ЭтоГруппа Тогда
		ГруппаФайлов = ТекущиеДанные.Ссылка;
	ИначеЕсли ТекущиеДанные <> Неопределено И Не ЭтоВладелецЭлементовСправочникаФайлы Тогда
		ГруппаФайлов = ГруппаФайла(ТекущиеДанные.Ссылка);
	КонецЕсли;
	ПараметрыФормы.Вставить("ГруппаФайлов",                  ГруппаФайлов);
	ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаИмпортаФайлов", ПараметрыФормы);
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьПапку(Команда)
	
	#Если ВебКлиент Тогда
		ТекстПредупреждения = НСтр("ru = 'В веб-клиенте импорт папок недоступен.
			                             |Используйте команду ""Создать"" в списке файлов.'");
		ПоказатьПредупреждение(, ТекстПредупреждения);
		Возврат;
	#КонецЕсли
	
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	ДиалогОткрытияФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы());
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'");
	Если Не ДиалогОткрытияФайла.Выбрать() Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПапкаДляДобавления",            ВладелецФайла);
	ПараметрыФормы.Вставить("КаталогНаДиске",                ДиалогОткрытияФайла.Каталог);
	ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ИмяСправочникаХранилищаФайлов);
	ТекущиеДанные = ТекущиеДанные();
	ГруппаФайлов = Неопределено;
	Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ЭтоГруппа Тогда
		ГруппаФайлов = ТекущиеДанные.Ссылка;
	ИначеЕсли ТекущиеДанные <> Неопределено Тогда
		ГруппаФайлов = ГруппаФайла(ТекущиеДанные.Ссылка);
	КонецЕсли;
	ПараметрыФормы.Вставить("ГруппаФайлов",      ГруппаФайлов);
	
	ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаИмпортаПапки", ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПапку(Команда)
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные = Неопределено Или Не ТекущиеДанные.ЭтоГруппа Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПапкаЭкспорта",                  ТекущиеДанные.Ссылка);
	ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов",  ИмяСправочникаХранилищаФайлов);
	ПараметрыФормы.Вставить("ИмяСправочникаХранилищаВерсийФайлов", ИмяСправочникаХранилищаВерсийФайлов);
	ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаЭкспортаПапки", ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура СравнитьФайлы(Команда)
	
	ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество();
	
	Если ЧислоВыделенныхСтрок = 2 Тогда
		
		Ссылка1 = Элементы.Список.ВыделенныеСтроки[0];
		Ссылка2 = Элементы.Список.ВыделенныеСтроки[1];
		
		ТекущиеДанные = ТекущиеДанные();
		Расширение = НРег(ТекущиеДанные.Расширение);
		
		РаботаСФайламиСлужебныйКлиент.СравнитьФайлы(УникальныйИдентификатор, Ссылка1, Ссылка2, Расширение);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиВГруппу(Команда)
	Если Элементы.Список.ВыделенныеСтроки.Количество() > 0 Тогда
		ПараметрыОткрытия = Новый Структура;
		ПараметрыОткрытия.Вставить("ВладелецФайлов", ВладелецФайла);
		ПараметрыОткрытия.Вставить("ПеремещаемыеФайлы", Элементы.Список.ВыделенныеСтроки);
		ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборГруппы", ПараметрыОткрытия, ЭтотОбъект);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьСлужебныеФайлы(Команда)
	
	Элементы.ПоказыватьСлужебныеФайлы.Пометка = 
		РаботаСФайламиСлужебныйКлиент.ПоказыватьСлужебныеФайлыНажатие(Список);
	
КонецПроцедуры

//////////////////////////////////////////////////////////////////////////////////
// Обработчики команд для поддержки ЭП и шифрования.

&НаКлиенте
Процедура Подписать(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения      = Новый ОписаниеОповещения("ДобавлениеПодписейЗавершить", ЭтотОбъект);
	ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОписаниеОповещения);
	
	МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
	ПараметрыПодписания = МодульЭлектроннаяПодписьКлиент.НовыйТипПодписи();
	ПараметрыПодписания.ВыборДоверенности = Истина;
	
	РаботаСФайламиКлиент.ПодписатьФайл(Элементы.Список.ВыделенныеСтроки, УникальныйИдентификатор,
		ДополнительныеПараметры, ПараметрыПодписания);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВместеСЭП(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные.Зашифрован Тогда
		Возврат;
	КонецЕсли;
	
	РаботаСФайламиСлужебныйКлиент.СохранитьФайлВместеСПодписью(
		ТекущиеДанные.Ссылка, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьЭПИзФайла(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные.ФайлРедактируется
		ИЛИ ТекущиеДанные.Зашифрован Тогда
		Возврат;
	КонецЕсли;
	
	ПрисоединенныйФайл = ТекущиеДанные.Ссылка;
	
	РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла(
		ПрисоединенныйФайл,
		УникальныйИдентификатор,
		Новый ОписаниеОповещения("ДобавлениеПодписейЗавершить", ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура Зашифровать(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные.ФайлРедактируется
		ИЛИ ТекущиеДанные.Зашифрован Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ТекущиеДанные.Ссылка);
	
	Если ЗначениеЗаполнено(ДанныеФайла.Редактирует)
		ИЛИ ДанныеФайла.Зашифрован Тогда
		// Файл может быть изменен в другом сеансе.
		ОповеститьОбИзменении(ТекущиеДанные.Ссылка);
		Возврат;
	КонецЕсли;
	
	ПараметрыОбработчика = Новый Структура;
	ПараметрыОбработчика.Вставить("ДанныеФайла",  ДанныеФайла);
	ПараметрыОбработчика.Вставить("ОбъектСсылка", ТекущиеДанные.Ссылка);
	Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика);
	
	РаботаСФайламиСлужебныйКлиент.Зашифровать(Обработчик, ДанныеФайла, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт
	Если Не Результат.Успех Тогда
		Возврат;
	КонецЕсли;
	
	ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя();
	
	МассивФайловВРабочемКаталогеДляУдаления = Новый Массив;
	
	ЗашифроватьСервер(
		Результат.МассивДанныхДляЗанесенияВБазу,
		Результат.МассивОтпечатков,
		МассивФайловВРабочемКаталогеДляУдаления,
		ИмяРабочегоКаталога,
		ПараметрыВыполнения.ОбъектСсылка);
	
	РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании(
		МассивФайловВРабочемКаталогеДляУдаления,
		ПараметрыВыполнения.ДанныеФайла.Владелец,
		ПараметрыВыполнения.ОбъектСсылка);
	
	УстановитьДоступностьФайловыхКоманд();
	
КонецПроцедуры

&НаСервере
Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, 
	МассивФайловВРабочемКаталогеДляУдаления,
	ИмяРабочегоКаталога, ОбъектСсылка)
	
	ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании();
	ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога;
	ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу;
	ПараметрыЗаписиИнформацииОШифровании.МассивОтпечатков = МассивОтпечатков;
	ПараметрыЗаписиИнформацииОШифровании.МассивФайловВРабочемКаталогеДляУдаления = МассивФайловВРабочемКаталогеДляУдаления;
	
	РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании(
		ОбъектСсылка, ПараметрыЗаписиИнформацииОШифровании);
	
КонецПроцедуры

&НаКлиенте
Процедура Расшифровать(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если НЕ ТекущиеДанные.Зашифрован Тогда
		Возврат;
	КонецЕсли;
	
	ОбъектСсылка = ТекущиеДанные.Ссылка;
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка);
	
	ПараметрыОбработчика = Новый Структура;
	ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла);
	ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка);
	Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеРасшифровкиНаКлиенте", ЭтотОбъект, ПараметрыОбработчика);
	
	РаботаСФайламиСлужебныйКлиент.Расшифровать(
		Обработчик,
		ДанныеФайла.Ссылка,
		УникальныйИдентификатор,
		ДанныеФайла);
		
КонецПроцедуры

&НаКлиенте
Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт
	
	Если Результат = Ложь Или Не Результат.Успех Тогда
		Возврат;
	КонецЕсли;
	
	ИмяРабочегоКаталога = РаботаСФайламиСлужебныйКлиент.РабочийКаталогПользователя();
	
	РасшифроватьСервер(
		Результат.МассивДанныхДляЗанесенияВБазу,
		ИмяРабочегоКаталога,
		ПараметрыВыполнения.ОбъектСсылка);
	
	РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке(
		ПараметрыВыполнения.ДанныеФайла.Владелец,
		ПараметрыВыполнения.ОбъектСсылка);
	
	УстановитьДоступностьФайловыхКоманд();
	
КонецПроцедуры

&НаСервере
Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, 
	ИмяРабочегоКаталога, ОбъектСсылка)
	
	ПараметрыЗаписиИнформацииОШифровании = РаботаСФайламиСлужебный.ПараметрыЗаписиИнформацииОШифровании();
	ПараметрыЗаписиИнформацииОШифровании.Зашифровать = Ложь;
	ПараметрыЗаписиИнформацииОШифровании.ИмяРабочегоКаталога = ИмяРабочегоКаталога;
	ПараметрыЗаписиИнформацииОШифровании.МассивДанныхДляЗанесенияВБазу = МассивДанныхДляЗанесенияВБазу;
	
	РаботаСФайламиСлужебный.ЗаписатьИнформациюОШифровании(
		ОбъектСсылка, ПараметрыЗаписиИнформацииОШифровании);
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////
// Обработчики команд для поддержки совместной работы с файлами.

&НаКлиенте
Процедура Редактировать(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если (ТекущиеДанные.ФайлРедактируется И НЕ ТекущиеДанные.ФайлРедактируетТекущийПользователь)
		ИЛИ ТекущиеДанные.Зашифрован
		ИЛИ ТекущиеДанные.ПодписанЭП Тогда
		Возврат;
	КонецЕсли;
	
	РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Неопределено, ТекущиеДанные.Ссылка);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакончитьРедактирование(Команда)
	
	МассивФайлов = Новый Массив;
	Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл
		
		ДанныеСтроки = ДанныеСтрокиСписка(ЭлементСписка);
		Если НЕ ДанныеСтроки.ФайлРедактируется
			Или НЕ ДанныеСтроки.ФайлРедактируетТекущийПользователь Тогда
			
			Продолжить;
		КонецЕсли;
		
		МассивФайлов.Добавить(ДанныеСтроки.Ссылка);
		
	КонецЦикла;
	
	Если МассивФайлов.Количество() > 1 Тогда
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("МассивФайлов",                     МассивФайлов);
		ПараметрыФормы.Вставить("ЕстьВерсииФайлов", ЕстьВерсииФайлов);
		ПараметрыФормы.Вставить("Редактирует",                      ДанныеСтроки.РедактируетПользователь);
		
		ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаЗавершениеРедактирования", ПараметрыФормы, ЭтотОбъект);
	ИначеЕсли МассивФайлов.Количество() = 1 Тогда 
		Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект);
		ПараметрыОбновленияФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(Обработчик, ДанныеСтроки.Ссылка, УникальныйИдентификатор);
		Если Не ЕстьВерсииФайлов Тогда
			ПараметрыОбновленияФайла.Вставить("СоздатьНовуюВерсию", Ложь);
		КонецЕсли;
		РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Освободить(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлы(Элементы.Список);
	УстановитьДоступностьФайловыхКоманд();
	
КонецПроцедуры

&НаКлиенте
Процедура Занять(Команда)
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	КоличествоФайлов = Элементы.Список.ВыделенныеСтроки.Количество();
	Если КоличествоФайлов = 1 Тогда
		Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект);
		РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока);
	ИначеЕсли КоличествоФайлов > 1 Тогда
		
		МассивФайлов = Новый Массив;
		Для Каждого ЭлементСписка Из Элементы.Список.ВыделенныеСтроки Цикл
			
			ДанныеСтроки = ДанныеСтрокиСписка(ЭлементСписка);
			Если ЗначениеЗаполнено(ДанныеСтроки.РедактируетПользователь) Тогда
				Продолжить;
			КонецЕсли;
			
			МассивФайлов.Добавить(ДанныеСтроки.Ссылка);
			
		КонецЦикла;
		
		Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект, МассивФайлов);
		РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, МассивФайлов);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Удалить(Команда)
	
	ВыделенныеСтроки = ВыделенныеСтроки();
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУдаленияДанных", ЭтотОбъект);
	РаботаСФайламиСлужебныйКлиент.УдалитьДанныеФайлов(ОписаниеОповещения, ВыделенныеСтроки, УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьПомеченныеФайлы(Команда)
	
	РаботаСФайламиСлужебныйКлиент.ИзменитьОтборПоПометкеУдаления(Список.Отбор, Элементы.ПоказыватьПомеченныеФайлы);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ПослеУдаленияДанных(Результат, ДополнительныеПараметры) Экспорт
	
	Элементы.Список.Обновить();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	Список.УсловноеОформление.Элементы.Очистить();
	
	// Оформление файла, занятого для редактирования другим пользователем.
	
	Элемент = Список.УсловноеОформление.Элементы.Добавить();
	
	Если ЕстьРеквизитСлужебный Тогда
		ГруппаОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
		
		ОтборЭлемента = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФайлРедактируетДругойПользователь");
		ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ОтборЭлемента.ПравоеЗначение = Истина;
		
		ОтборЭлемента = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ОтборЭлемента.Использование = Истина;
		ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Служебный");
		ОтборЭлемента.ПравоеЗначение = Ложь;
	Иначе
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФайлРедактируетДругойПользователь");
		ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ОтборЭлемента.ПравоеЗначение = Истина;
	КонецЕсли;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	
	// Оформление файла, занятого для редактирования текущим пользователем.
	
	Элемент = Список.УсловноеОформление.Элементы.Добавить();
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФайлРедактируетТекущийПользователь");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ФайлЗанятыйТекущимПользователем);
	
	// Скрытие групп файлов, которые относятся к другим объектам-владельцам
	Если ЕстьГруппыФайлов Тогда
		Элемент = Список.УсловноеОформление.Элементы.Добавить();
		
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВладелецФайла");
		ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
		ОтборЭлемента.ПравоеЗначение = ВладелецФайла;
		
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
		ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ОтборЭлемента.ПравоеЗначение = Истина;
		
		Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
		Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
	КонецЕсли;
	
	// Служебные файлы
	
	Элемент = Список.УсловноеОформление.Элементы.Добавить();
	Элемент.Использование = Истина;
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	
	Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Отбор.Использование = Истина;
	Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Служебный");
	Отбор.ПравоеЗначение = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьФайл()
	
	ТекущиеДанные = ТекущиеДанные();
	ГруппаФайлов = Неопределено;
	Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ЭтоГруппа Тогда
		ГруппаФайлов = ТекущиеДанные.Ссылка;
	ИначеЕсли ТекущиеДанные <> Неопределено И Не ЭтоВладелецЭлементовСправочникаФайлы Тогда
		ГруппаФайлов = ГруппаФайла(ТекущиеДанные.Ссылка);
	КонецЕсли;
	Если ЭтоВладелецЭлементовСправочникаФайлы Тогда
		РаботаСФайламиСлужебныйКлиент.ДобавитьФайлИзФайловойСистемы(Параметры.ВладелецФайла, ЭтотОбъект);
	Иначе
		РаботаСФайламиКлиент.ДобавитьФайлы(Параметры.ВладелецФайла, УникальныйИдентификатор, , ГруппаФайлов);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФайл()
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	
	Если ТекущиеДанные.Зашифрован Тогда
		Возврат;
	КонецЕсли;
	
	Если ЗапрещенныеРасширения.НайтиПоЗначению(ТекущиеДанные.Расширение) <> Неопределено Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ТекущиеДанные", ТекущиеДанные);
		Оповещение = Новый ОписаниеОповещения("ОткрытьФайлПослеПодтверждения", ЭтотОбъект, ДополнительныеПараметры);
		ПараметрыФормы = Новый Структура("Ключ", "ПередОткрытиемФайла");
		ПараметрыФормы.Вставить("ИмяФайла",
			ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ТекущиеДанные.Наименование, ТекущиеДанные.Расширение));
		ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение);
		Возврат;
	КонецЕсли;
	
	ФайлРедактируется = ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь;
	
	ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор);
	Если ДанныеФайла.Зашифрован Тогда
		// Файл может быть изменен в другом сеансе.
		ОповеститьОбИзменении(ТекущиеДанные.Ссылка);
		Возврат;
	КонецЕсли;
	
	РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьКарточкуФайла()
	
	Если НЕ ФайловыеКомандыДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Ключ",              ТекущиеДанные.Ссылка);
	ПараметрыФормы.Вставить("ТолькоПросмотр",    ТолькоПросмотр);
	ПараметрыФормы.Вставить("ПараметрыОтправки", ПараметрыОтправки);
	
	Если ТекущиеДанные.ЭтоГруппа Тогда
		ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ГруппаФайлов", ПараметрыФормы);
	Иначе
		РаботаСФайламиКлиент.ОткрытьФормуФайла(ТекущиеДанные.Ссылка,, ПараметрыФормы);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФайлПослеПодтверждения(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено И Результат = "Продолжить" Тогда
		
		ТекущиеДанные = ДополнительныеПараметры.ТекущиеДанные; // см. ОбработкаОбъект.ПоискИУдалениеДублей.ГруппыДублей
		
		ФайлРедактируется = ТекущиеДанные.ФайлРедактируется И ТекущиеДанные.ФайлРедактируетТекущийПользователь;
		
		ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор);
		Если ДанныеФайла.Зашифрован Тогда
			// Файл может быть изменен в другом сеансе.
			ОповеститьОбИзменении(ТекущиеДанные.Ссылка);
			Возврат;
		КонецЕсли;
		
		РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокВыборПослеВыбораРежимаРедактирования(Результат, ПараметрыВыполнения) Экспорт
	
	Если Результат = "Редактировать" Тогда
		Обработчик = Новый ОписаниеОповещения("СписокВыборПослеРедактированияФайла", ЭтотОбъект, ПараметрыВыполнения);
		РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла);
	ИначеЕсли Результат = "Открыть" Тогда
		РаботаСФайламиКлиент.ОткрытьФайл(ПараметрыВыполнения.ДанныеФайла, Ложь);
	КонецЕсли;
	
КонецПроцедуры

// Параметры:
//   Результат - Неопределено
//   ПараметрыВыполнения - Структура:
//     * ДанныеФайла - см. РаботаСФайлами.ДанныеФайла
//
&НаКлиенте
Процедура СписокВыборПослеРедактированияФайла(Результат, ПараметрыВыполнения) Экспорт
	
	ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка);
	
	УстановитьДоступностьФайловыхКоманд();
	
КонецПроцедуры

&НаКлиенте
Функция ФайловыеКомандыДоступны()
	
	Возврат РаботаСФайламиСлужебныйКлиент.ФайловыеКомандыДоступны(Элементы);
	
КонецФункции

&НаСервере
Процедура СкрытьКнопкиСозданияГруппы()
	Элементы.СоздатьГруппу.Видимость                           = Ложь;
	Элементы.СписокКонтекстноеМенюСоздатьГруппу.Видимость      = Ложь;
	Элементы.ЗагрузитьПапку.Видимость                          = Ложь;
	Элементы.СохранитьПапку.Видимость                          = Ложь;
	Элементы.ПеренестиВГруппу.Видимость                        = Ложь;
	Элементы.СписокКонтекстноеМенюПереместитьВГруппу.Видимость = Ложь;
КонецПроцедуры

&НаСервере
Процедура СкрытьКнопкиДобавления()
	
	Элементы.Добавить.Видимость                           = Ложь;
	Элементы.ДобавитьИзФайлаНаДиске.Видимость             = Ложь;
	Элементы.ДобавитьФайлПоШаблону.Видимость              = Ложь;
	Элементы.ДобавитьФайлСоСканера.Видимость              = Ложь;
	Элементы.СписокКонтекстноеМенюДобавить.Видимость      = Ложь;
	Элементы.СписокКонтекстноеМенюСоздатьГруппу.Видимость = Ложь;
	Элементы.СоздатьГруппу.Видимость                      = Ложь;
	Элементы.СписокКонтекстноеМенюСоздатьГруппу.Видимость = Ложь;
	Элементы.ФормаСкопировать.Видимость                   = Ложь;
	Элементы.СписокКонтекстноеМенюСкопировать.Видимость   = Ложь;
	
КонецПроцедуры

&НаСервере
Процедура СкрытьКнопкиИзменения()
	
	ИменаКоманд = ИменаКомандИзмененияОбъектов();
	Для каждого ИмяЭлементаФормы Из ИменаЭлементовКнопокФормы Цикл
		
		ЭлементФормы = Элементы.Найти(ИмяЭлементаФормы);
		Если ИменаКоманд[ЭлементФормы.ИмяКоманды] <> Неопределено Тогда
			ЭлементФормы.Видимость = Ложь;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ОпределитьИменаЭлементовКнопокФормы()
	
	ИменаКомандФормы = ИменаКомандФормы();
	ИменаЭлементов = Новый Массив;
	
	Для Каждого ЭлементФормы Из Элементы Цикл
		
		Если ТипЗнч(ЭлементФормы) <> Тип("КнопкаФормы") Тогда
			Продолжить;
		КонецЕсли;
		
		Если ИменаКомандФормы[ЭлементФормы.ИмяКоманды] <> Неопределено 
			Или ИменаКомандФормы[ЭлементФормы.Имя] <> Неопределено Тогда
			ИменаЭлементов.Добавить(ЭлементФормы.Имя);
		КонецЕсли;
		
	КонецЦикла;
	Возврат Новый ФиксированныйМассив(ИменаЭлементов);
	
КонецФункции

&НаКлиенте
Процедура УстановитьДоступностьФайловыхКоманд(Результат = Неопределено, ПараметрыВыполнения = Неопределено) Экспорт
	
	ТекущиеДанные = ТекущиеДанные();
	
	ИменаКоманд = Новый Соответствие;
	Если ТекущиеДанные = Неопределено И Не ФайлыРедактируютсяВОблачномСервисе Тогда
		
		ИменаКоманд.Вставить("Добавить", Истина);
		ИменаКоманд.Вставить("ДобавитьФайлСоСканера", Истина);
		ИменаКоманд.Вставить("ДобавитьФайлПоШаблону", Истина);
		ИменаКоманд.Вставить("ЗагрузитьФайлы", Истина);
		ИменаКоманд.Вставить("ЗагрузитьПапку", Истина);
		
	ИначеЕсли ТекущиеДанные <> Неопределено И ТипЗнч(Элементы.Список.ТекущаяСтрока) = ТипСправочникаСФайлами Тогда
		
		ВозможностьОсвободитьФайл = РаботаСФайламиСлужебныйКлиент.ВозможностьОсвободитьФайл(
			ТекущиеДанные.Ссылка,
			ТекущиеДанные.ФайлРедактируетТекущийПользователь,
			ТекущиеДанные.РедактируетПользователь);
			
		ИменаКоманд = ДоступныеКоманды(ТекущиеДанные, ФайлыРедактируютсяВОблачномСервисе,
			ВозможностьОсвободитьФайл, ПользователиКлиент.АвторизованныйПользователь());
			
	КонецЕсли;
	
	Если ТекущиеДанные <> Неопределено Тогда
		Элементы.ПечатьСоШтампом.Видимость = ЕстьЭлектроннаяПодпись
			И (ТекущиеДанные.Расширение = "mxl") ИЛИ (ТекущиеДанные.Расширение = "docx")
			И ТекущиеДанные.ПодписанЭП;
	КонецЕсли;
	
	Для каждого ИмяЭлементаФормы Из ИменаЭлементовКнопокФормы Цикл
		
		ЭлементФормы = Элементы.Найти(ИмяЭлементаФормы);
		Если ИменаКоманд[ЭлементФормы.ИмяКоманды] = Истина Или ИменаКоманд[ЭлементФормы.Имя] = Истина Тогда
			
			Если НЕ ЭлементФормы.Доступность Тогда
				ЭлементФормы.Доступность = Истина;
			КонецЕсли;
			
		ИначеЕсли ЭлементФормы.Доступность Тогда
			ЭлементФормы.Доступность = Ложь;
		КонецЕсли;
	КонецЦикла;
	
	ПодключитьОбработчикОжидания("ОбновитьПредпросмотр", 0.1, Истина);

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкуУдаленияЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		УстановитьСнятьПометкуУдаления(ДополнительныеПараметры.Файлы);
		ПараметрыОповещенияЗаписиФайла = РаботаСФайламиСлужебныйКлиент.ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены");
		Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла, Элементы.Список.ВыделенныеСтроки);
		Элементы.Список.Обновить();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьДинамическийСписок()
	
	СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	Файлы.Ссылка КАК Ссылка,
	|	Файлы.ПометкаУдаления,
	|	ВЫБОР
	|		КОГДА Файлы.ПометкаУдаления = ИСТИНА
	|			ТОГДА ЕСТЬNULL(Файлы.ИндексКартинки, 2) + 1
	|		ИНАЧЕ ЕСТЬNULL(Файлы.ИндексКартинки, 2)
	|	КОНЕЦ КАК ИндексКартинки,
	|	Файлы.Наименование КАК Наименование,
	|	ВЫРАЗИТЬ(Файлы.Описание КАК СТРОКА(500)) КАК Описание,
	|	Файлы.Автор,
	|	Файлы.ДатаСоздания,
	|	Файлы.Изменил КАК Отредактировал,
	|	ДОБАВИТЬКДАТЕ(Файлы.ДатаМодификацииУниверсальная, СЕКУНДА, &СекундДоМестногоВремени) КАК ДатаИзменения,
	|	ВЫРАЗИТЬ(Файлы.Размер / 1024 КАК ЧИСЛО(10, 0)) КАК Размер,
	|	Файлы.ПодписанЭП,
	|	Файлы.Зашифрован,
	|	ВЫБОР
	|		КОГДА Файлы.ПодписанЭП
	|				И Файлы.Зашифрован
	|			ТОГДА 2
	|		КОГДА Файлы.Зашифрован
	|			ТОГДА 1
	|		КОГДА Файлы.ПодписанЭП
	|			ТОГДА 0
	|		ИНАЧЕ -1
	|	КОНЕЦ КАК НомерКартинкиПодписанЗашифрован,
	|	ВЫБОР
	|		КОГДА НЕ Файлы.Редактирует В (&ПустыеПользователи)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ФайлРедактируется,
	|	ВЫБОР
	|		КОГДА Файлы.Редактирует = &ТекущийПользователь
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ФайлРедактируетТекущийПользователь,
	|	ВЫБОР
	|		КОГДА НЕ Файлы.Редактирует В (&ПустыеПользователи)
	|				И Файлы.Редактирует <> &ТекущийПользователь
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ФайлРедактируетДругойПользователь,
	|	Файлы.Расширение КАК Расширение,
	|	ВЫБОР
	|		КОГДА СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись <> НЕОПРЕДЕЛЕНО
	|				И Файлы.Редактирует = НЕОПРЕДЕЛЕНО
	|			ТОГДА СтатусыСинхронизацииФайловСОблачнымСервисом.УчетнаяЗапись
	|		ИНАЧЕ Файлы.Редактирует
	|	КОНЕЦ КАК Редактирует,
	|	Файлы.Редактирует КАК РедактируетПользователь,
	|	&ЭтоГруппа КАК ЭтоГруппа,
	|	&Служебный КАК Служебный,
	|	&ГруппаФайла КАК ГруппаФайла,
	|	Файлы.ВладелецФайла КАК ВладелецФайла,
	|	Файлы.ХранитьВерсии КАК ХранитьВерсии
	|ИЗ
	|	&ИмяСправочника КАК Файлы
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом
	|		ПО Файлы.Ссылка = СтатусыСинхронизацииФайловСОблачнымСервисом.Файл
	|ГДЕ
	|	Файлы.ВладелецФайла = &ВладелецФайлов";
	
	ПолноеИмяСправочника = "Справочник." + ИмяСправочникаХранилищаФайлов;
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", ПолноеИмяСправочника);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Служебный", ?(ЕстьРеквизитСлужебный, "Файлы.Служебный", "ЛОЖЬ"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ГруппаФайла", ?(ЕстьГруппыФайлов, "Файлы.Родитель", "НЕОПРЕДЕЛЕНО"));
	
	
	СвойстваСписка.ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоГруппа",
		?(ЕстьГруппыФайлов, "Файлы.ЭтоГруппа", "ЛОЖЬ"));
		
	СвойстваСписка.ОсновнаяТаблица  = ПолноеИмяСправочника;
	СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
	ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка);
	
	ПустыеПользователи = Новый Массив;
	ПустыеПользователи.Добавить(Неопределено);
	ПустыеПользователи.Добавить(Справочники.Пользователи.ПустаяСсылка());
	ПустыеПользователи.Добавить(Справочники.ВнешниеПользователи.ПустаяСсылка());
	ПустыеПользователи.Добавить(Справочники.УчетныеЗаписиСинхронизацииФайлов.ПустаяСсылка());
	
	Список.Параметры.УстановитьЗначениеПараметра("ВладелецФайлов",      Параметры.ВладелецФайла);
	Список.Параметры.УстановитьЗначениеПараметра("ТекущийПользователь", Пользователи.АвторизованныйПользователь());
	Список.Параметры.УстановитьЗначениеПараметра("ПустыеПользователи",  ПустыеПользователи);
	
	ДатаУниверсальная = ТекущаяДатаСеанса();
	Список.Параметры.УстановитьЗначениеПараметра("СекундДоМестногоВремени",
		МестноеВремя(ДатаУниверсальная, ЧасовойПоясСеанса()) - ДатаУниверсальная);
	
КонецПроцедуры

&НаСервере
Процедура ВывестиУведомлениеЕслиМногоГрупп(МетаданныеСправочникаСФайлами) 
	
	МинимальноеКоличествоГруппДляВыводаСообщения = 5000;
	
	Если Не МетаданныеСправочникаСФайлами.Иерархический Или Элементы.Список.Отображение = ОтображениеТаблицы.Список Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	ТекстЗапроса = 
		"ВЫБРАТЬ 
		|	КОЛИЧЕСТВО(СправочникПрисоединенныеФайлы.ЭтоГруппа) КАК КоличествоГрупп
		|ИЗ
		|	#СправочникПрисоединенныеФайлы КАК СправочникПрисоединенныеФайлы
		|ГДЕ
		|	СправочникПрисоединенныеФайлы.ЭтоГруппа = ИСТИНА";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#СправочникПрисоединенныеФайлы", МетаданныеСправочникаСФайлами.ПолноеИмя());
	
	Запрос = Новый Запрос(ТекстЗапроса);
	
	ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		Если ВыборкаДетальныеЗаписи.КоличествоГрупп >= МинимальноеКоличествоГруппДляВыводаСообщения Тогда
			Элементы.ИнформационноеСообщение.Видимость = Истина;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ИменаКомандФормы()
	
	Результат = ИменаКомандИзмененияОбъектов();

	// Команды, доступные любому пользователю, читающему файлы.
	Результат.Вставить("ОткрытьКаталогФайла", Истина);
	Результат.Вставить("ОткрытьФайлДляПросмотра", Истина);
	Результат.Вставить("СохранитьКак", Истина);
	
	Возврат Результат;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИменаКомандИзмененияОбъектов()
	
	Результат = Новый Соответствие;
	
	// Команды, зависимые от состояния объектов.
	Результат.Вставить("ЗакончитьРедактирование", Истина);
	Результат.Вставить("Занять", Истина);
	Результат.Вставить("Освободить", Истина);
	Результат.Вставить("Редактировать", Истина);
	Результат.Вставить("УстановитьПометкуУдаления", Истина);
	Результат.Вставить("Удалить", Истина);
	Результат.Вставить("КонтекстноеМенюУстановитьПометкуУдаления", Истина);
	
	Результат.Вставить("Подписать", Истина);
	Результат.Вставить("ДобавитьЭПИзФайла", Истина);
	Результат.Вставить("СохранитьВместеСЭП", Истина);
	
	Результат.Вставить("Зашифровать", Истина);
	Результат.Вставить("Расшифровать", Истина);
	
	Результат.Вставить("Печать", Истина);
	Результат.Вставить("ПечатьСоШтампом", Истина);
	
	Результат.Вставить("Отправить", Истина);
	
	Результат.Вставить("ОбновитьИзФайлаНаДиске", Истина);
	
	// Команды, независимые от состояния объектов.
	Результат.Вставить("Добавить", Истина);
	Результат.Вставить("ДобавитьИзФайлаНаДиске", Истина);
	Результат.Вставить("ДобавитьФайлПоШаблону", Истина);
	Результат.Вставить("ДобавитьФайлСоСканера", Истина);
	Результат.Вставить("ОткрытьСвойстваФайла", Истина);
	Результат.Вставить("Скопировать", Истина);
	Результат.Вставить("ЗагрузитьФайлы", Истина);
	Результат.Вставить("ЗагрузитьПапку", Истина);
	
	Результат.Вставить("ПереместитьВГруппу", Истина);
	
	Возврат Результат;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ДоступныеКоманды(ТекущиеДанныеФайла, ФайлыРедактируютсяВОблачномСервисе, ВозможностьОсвободитьФайл, 
	АвторизованныйПользователь)
	
	ИменаКоманд = ИменаКомандФормы();
	
	ФайлРедактируетТекущийПользователь = ТекущиеДанныеФайла.ФайлРедактируетТекущийПользователь;
	АвторТекущийПользователь           = ТекущиеДанныеФайла.Автор = АвторизованныйПользователь;
	ФайлРедактируется                  = ТекущиеДанныеФайла.ФайлРедактируется;
	ФайлПодписан                       = ТекущиеДанныеФайла.ПодписанЭП;
	ФайлЗашифрован                     = ТекущиеДанныеФайла.Зашифрован;
	
	Если ФайлРедактируется Тогда
		
		Если ФайлРедактируетТекущийПользователь Тогда
			ИменаКоманд["ОбновитьИзФайлаНаДиске"] = Ложь;
		Иначе
			ИменаКоманд["ЗакончитьРедактирование"] = Ложь;
			Если Не ВозможностьОсвободитьФайл Тогда
				ИменаКоманд["Освободить"] = Ложь;
			КонецЕсли;
			ИменаКоманд["Редактировать"] = Ложь;
		КонецЕсли;
		
		ИменаКоманд["Занять"] = Ложь;
		ИменаКоманд["УстановитьПометкуУдаления"] = Ложь;
		ИменаКоманд["КонтекстноеМенюУстановитьПометкуУдаления"] = Ложь;

		ИменаКоманд["Подписать"] = Ложь;
		ИменаКоманд["ДобавитьЭПИзФайла"] = Ложь;
		ИменаКоманд["СохранитьВместеСЭП"] = Ложь;
		
		ИменаКоманд["ОбновитьИзФайлаНаДиске"] = Ложь;
		ИменаКоманд["СохранитьКак"] = Ложь;
		
		ИменаКоманд["Зашифровать"] = Ложь;
		ИменаКоманд["Расшифровать"] = Ложь;
		
		ИменаКоманд["Удалить"] = Ложь;
		
	Иначе
		ИменаКоманд["ЗакончитьРедактирование"] = Ложь;
		ИменаКоманд["Освободить"] = Ложь;
	КонецЕсли;
	
	Если ТекущиеДанныеФайла.ЭтоГруппа Тогда
		ИменаКоманд["Редактировать"] = Ложь;
		ИменаКоманд["Подписать"] = Ложь;
		ИменаКоманд["ДобавитьЭПИзФайла"] = Ложь;
		ИменаКоманд["СохранитьВместеСЭП"] = Ложь;
		ИменаКоманд["Зашифровать"] = Ложь;
		ИменаКоманд["Расшифровать"] = Ложь;
		ИменаКоманд["ОбновитьИзФайлаНаДиске"] = Ложь;
		ИменаКоманд["Скопировать"] = Ложь;
		ИменаКоманд["ОткрытьКаталогФайла"] = Ложь;
		ИменаКоманд["ОткрытьФайлДляПросмотра"] = Ложь;
		ИменаКоманд["СохранитьКак"] = Ложь;
		ИменаКоманд["Занять"] = Ложь;
		ИменаКоманд["Отправить"] = Ложь;
		ИменаКоманд["ПечатьСоШтампом"] = Ложь;
		ИменаКоманд["Печать"] = Ложь;
		ИменаКоманд["Удалить"] = Ложь;
	КонецЕсли;
	
	Если ФайлПодписан Тогда
		ИменаКоманд["ЗакончитьРедактирование"] = Ложь;
		ИменаКоманд["Освободить"] = Ложь;
		ИменаКоманд["Редактировать"] = Ложь;
		ИменаКоманд["ОбновитьИзФайлаНаДиске"] = Ложь;
		ИменаКоманд["Занять"] = Ложь;
	КонецЕсли;
	
	Если ФайлЗашифрован Тогда
		ИменаКоманд["Подписать"] = Ложь;
		ИменаКоманд["ДобавитьЭПИзФайла"] = Ложь;
		ИменаКоманд["СохранитьВместеСЭП"] = Ложь;
		
		ИменаКоманд["ЗакончитьРедактирование"] = Ложь;
		ИменаКоманд["Освободить"] = Ложь;
		ИменаКоманд["Редактировать"] = Ложь;
		ИменаКоманд["Занять"] = Ложь;
		
		ИменаКоманд["ОбновитьИзФайлаНаДиске"] = Ложь;
		
		ИменаКоманд["Зашифровать"] = Ложь;
		
		ИменаКоманд["ОткрытьКаталогФайла"] = Ложь;
		ИменаКоманд["ОткрытьФайлДляПросмотра"] = Ложь;
		ИменаКоманд["СохранитьКак"] = Ложь;
	Иначе
		ИменаКоманд["Расшифровать"] = Ложь;
	КонецЕсли;
	
	Если ФайлыРедактируютсяВОблачномСервисе Тогда
		
		ИменаКоманд["Добавить"] = Ложь;
		ИменаКоманд["ДобавитьИзФайлаНаДиске"] = Ложь;
		ИменаКоманд["ДобавитьФайлПоШаблону"] = Ложь;
		ИменаКоманд["ДобавитьФайлСоСканера"] = Ложь;
		ИменаКоманд["Скопировать"] = Ложь;
		
		ИменаКоманд["СоздатьГруппу"] = Ложь;
		ИменаКоманд["ПереместитьВГруппу"] = Ложь;
		ИменаКоманд["УстановитьПометкуУдаления"] = Ложь;
		ИменаКоманд["КонтекстноеМенюУстановитьПометкуУдаления"] = Ложь;
		ИменаКоманд["Занять"] = Ложь;
		ИменаКоманд["Освободить"] = Ложь;
		
		ИменаКоманд["ЗагрузитьФайлы"] = Ложь;
		ИменаКоманд["ЗагрузитьПапку"] = Ложь;
		
		ИменаКоманд["Удалить"] = Ложь;
		
		ИменаКоманд["Подписать"] = Ложь;
		ИменаКоманд["ДобавитьЭПИзФайла"] = Ложь;
		ИменаКоманд["Зашифровать"] = Ложь;
		ИменаКоманд["Расшифровать"] = Ложь;
		
	КонецЕсли;
	
	Если Не АвторТекущийПользователь Тогда
		ИменаКоманд["Удалить"] = Ложь;
	КонецЕсли;
	
	Возврат ИменаКоманд;
	
КонецФункции

&НаКлиенте
Процедура ПриИзмененииИспользованияПодписанияИлиШифрования()
	
	ПриИзмененииИспользованияПодписанияИлиШифрованияНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииИспользованияПодписанияИлиШифрованияНаСервере()
	
	РаботаСФайламиСлужебный.КриптографияПриСозданииФормыНаСервере(ЭтотОбъект);
	
КонецПроцедуры

// Продолжение процедуры Подписать, ДобавитьЭПИзФайла.
&НаКлиенте
Процедура ДобавлениеПодписейЗавершить(Успех, Контекст) Экспорт
	
	Если Успех = Истина Тогда
		УстановитьДоступностьФайловыхКоманд();
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СохранитьВариантПредпросмотра(ТипСправочникаСФайлами, Предпросмотр)
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ТипСправочникаСФайлами, "Предпросмотр", Предпросмотр);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПриОтправкеФайловПочтой(ПараметрыОтправки, Знач ФайлыДляОтправки, ВладелецФайлов, УникальныйИдентификатор)
	РаботаСФайламиПереопределяемый.ПриОтправкеФайловПочтой(ПараметрыОтправки, ФайлыДляОтправки, ВладелецФайлов, УникальныйИдентификатор);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УстановитьСнятьПометкуУдаления(Файлы)
	ПометкаУдаления = Неопределено;
	Для каждого ФайлСсылка Из Файлы Цикл
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных();
			ЭлементБлокировки = Блокировка.Добавить(ФайлСсылка.Метаданные().ПолноеИмя());
			ЭлементБлокировки.УстановитьЗначение("Ссылка", ФайлСсылка);
			Блокировка.Заблокировать();

			ФайлОбъект = ФайлСсылка.ПолучитьОбъект();
			Если ПометкаУдаления = Неопределено Тогда
				ПометкаУдаления = Не ФайлОбъект.ПометкаУдаления;
			КонецЕсли;
			ФайлОбъект.УстановитьПометкуУдаления(ПометкаУдаления);

			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВидимостьПредпросмотра(ИспользоватьПредпросмотр)
	
	Элементы.АдресДанныхФайла.Видимость = ИспользоватьПредпросмотр;
	Элементы.Предпросмотр.Пометка = ИспользоватьПредпросмотр;

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПредпросмотр()
	
	Если Не Предпросмотр Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = ТекущиеДанные();
	Если ТекущиеДанные <> Неопределено И РасширенияПоддерживающиеПредпросмотр.НайтиПоЗначению(ТекущиеДанные.Расширение) <> Неопределено Тогда
		
		Попытка
			ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(ТекущиеДанные.Ссылка, Неопределено, УникальныйИдентификатор,, АдресДанныхФайла);
			АдресДанныхФайла = ДанныеФайла.СсылкаНаДвоичныеДанныеФайла;
		Исключение
			// Если файла не существует, то будет вызвано исключение.
			АдресДанныхФайла         = Неопределено;
			ТекстНевыбраннойКартинки = НСтр("ru = 'Предварительный просмотр недоступен по причине:'") + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		КонецПопытки;
		
	Иначе
		
		АдресДанныхФайла         = Неопределено;
		ТекстНевыбраннойКартинки = НСтр("ru = 'Нет данных для предварительного просмотра'");
		
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(АдресДанныхФайла) Тогда
		Элементы.АдресДанныхФайла.ТекстНевыбраннойКартинки = ТекстНевыбраннойКартинки;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ОбновитьПояснениеОблачногоСервиса()
	
	ВидимостьПояснения = Ложь;
	
	Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюФайлов") Тогда
		
		СведенияОСинхронизации = РаботаСФайламиСлужебный.СведенияОСинхронизации(ВладелецФайла);
		
		Если СведенияОСинхронизации.Количество() > 0  Тогда
			
			ФайлыРедактируютсяВОблачномСервисе = Истина;
			УчетнаяЗапись = СведенияОСинхронизации.УчетнаяЗапись;
			ВидимостьПояснения = Истина;
			
			АдресПапкиВОблачномСервисе = РаботаСФайламиСлужебныйКлиентСервер.АдресВОблачномСервисе(
				СведенияОСинхронизации.Сервис, СведенияОСинхронизации.Href);
				
			Элементы.ДекорацияПояснение.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Работа с файлами ведется в облачном сервисе <a href=""%1"">%2</a>.'"),
				Строка(АдресПапкиВОблачномСервисе), Строка(СведенияОСинхронизации.УчетнаяЗаписьНаименование));
			
			Элементы.ДекорацияКартинкаСтатусСинхронизации.Видимость = НЕ СведенияОСинхронизации.Синхронизирован;
			Элементы.ДекорацияДатаСинхронизации.ОтображениеПодсказки =?(СведенияОСинхронизации.Синхронизирован, ОтображениеПодсказки.Нет, ОтображениеПодсказки.Кнопка);
			
			Элементы.ДекорацияДатаСинхронизации.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Синхронизировано: <a href=""%1"">%2</a>'"),
				"OpenJournal", Формат(СведенияОСинхронизации.ДатаСинхронизации, "ДЛФ=DD"));
			
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.ГруппаПояснениеОблачногоСервиса.Видимость = ВидимостьПояснения;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДанныеОтбораЖурналаРегистрации(Сервис)
	Возврат РаботаСФайламиСлужебный.ДанныеОтбораЖурналаРегистрации(Сервис);
КонецФункции

&НаСервере
Функция ПараметрыНастройкиСинхронизации(ВладелецФайла)
	
	ТипВладельцаФайла = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипСправочникаСФайлами);
	
	Отбор = Новый Структура(
	"ВладелецФайла, ТипВладельцаФайла, УчетнаяЗапись",
		ВладелецФайла,
		ТипВладельцаФайла,
		Справочники.УчетныеЗаписиСинхронизацииФайлов.ПустаяСсылка());
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	НастройкиСинхронизацииФайлов.ВладелецФайла,
		|	НастройкиСинхронизацииФайлов.ТипВладельцаФайла,
		|	НастройкиСинхронизацииФайлов.УчетнаяЗапись
		|ИЗ
		|	РегистрСведений.НастройкиСинхронизацииФайлов КАК НастройкиСинхронизацииФайлов
		|ГДЕ
		|	НастройкиСинхронизацииФайлов.ВладелецФайла = &ВладелецФайла
		|	И НастройкиСинхронизацииФайлов.ТипВладельцаФайла = &ТипВладельцаФайла";
	
	Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла);
	Запрос.УстановитьПараметр("ТипВладельцаФайла", ТипВладельцаФайла);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Количество() = 1 Тогда
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Отбор.УчетнаяЗапись = ВыборкаДетальныеЗаписи.УчетнаяЗапись;
		КонецЦикла;
	КонецЕсли;
	
	Возврат Отбор;
	
КонецФункции

&НаКлиенте
Процедура ОбновитьДоступностьФайловыхКоманд()
	
	УстановитьДоступностьФайловыхКоманд();
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВладелецФайловСовпадает(ВладелецФайлов, ПеретаскиваемыйФайл)
	
	Возврат ВладелецФайлов = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПеретаскиваемыйФайл, "ВладелецФайла");
	
КонецФункции

&НаСервереБезКонтекста
Процедура ПереместитьИлиСкопироватьПрисоединенныеФайлы(Знач МассивИменФайлов, Знач ВладелецФайла, Знач Действие)
	
	ВладелецПеретаскиваемогоФайла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(МассивИменФайлов[0], "ВладелецФайла");
	Если ТипЗнч(ВладелецПеретаскиваемогоФайла) <> ТипЗнч(ВладелецФайла) Тогда
		Возврат;
	КонецЕсли;
	
	Если Действие = "Перемещение" Тогда
		РаботаСФайламиСлужебныйВызовСервера.ПеренестиФайлы(МассивИменФайлов, ВладелецФайла);
	ИначеЕсли Действие = "Копирование" Тогда
		РаботаСФайламиСлужебныйВызовСервера.СкопироватьФайлы(МассивИменФайлов, ВладелецФайла);
	КонецЕсли;

КонецПроцедуры

// Возвращаемое значение:
//   ДанныеФормыСтруктура:
//     * Ссылка - СправочникСсылка
//   ДанныеФормыЭлементКоллекции:
//     * Ссылка - СправочникСсылка
//
&НаКлиенте
Функция ДанныеСтрокиСписка(ЭлементСписка)
	
	Возврат Элементы.Список.ДанныеСтроки(ЭлементСписка);
	
КонецФункции

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
	МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
	МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Функция ТекущиеДанные()
	Если Не СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(Элементы.Список) Тогда
		Возврат Неопределено;
	ИначеЕсли Элементы.Список.ТекущиеДанные.ВладелецФайла = ВладелецФайла Тогда
		Возврат Элементы.Список.ТекущиеДанные;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
КонецФункции

&НаСервереБезКонтекста
Функция ГруппаФайла(Файл)
	Если Файл.Метаданные().Иерархический Тогда
		Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Файл, "Родитель");
	Иначе
		Возврат Неопределено;
	КонецЕсли;
КонецФункции

&НаКлиенте
Функция ВыделенныеСтроки()
	ВыделенныеСтроки = Новый Массив;
	
	Для Каждого ВыделеннаяСтрока Из Элементы.Список.ВыделенныеСтроки Цикл
		Если ТипЗнч(ВыделеннаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
			ВыделенныеСтроки.Добавить(ВыделеннаяСтрока);
		КонецЕсли;
	КонецЦикла;
	
	Возврат ВыделенныеСтроки
	
КонецФункции

#КонецОбласти
